package com.humngyang.com.hmy.study.concurrency.myannoations.pushObject;

import com.humngyang.com.hmy.study.concurrency.myannoations.ThreadSafe;


//单例模式只懒汉模式双重同步锁单例模式
@ThreadSafe
public class SingletonExample4 {
    //构造方法私有化,不允许外面的方法直接调用
    private SingletonExample4(){}
    //定义一个单例对象  使用volatile + 双重检测机制禁止指令重排
    private volatile static SingletonExample4 instance = null;
    /*
     * 为什么双重同步锁机制不是线程安全的，因为当我们实例化一个对象的时候要进行三步操作
     *      1：分配对象的内存空间
     *      2：初始化对象
     *      3：设置instance指向刚设置的内存
     * 因为在多线程的时候，JVM和CPU优化会产生指令重排如下所示，可以使用volatile关键字禁止指令重排。
     */
    //双重检测机制
    private  static synchronized SingletonExample4 getInstance(){
        if (instance == null){                           //B
            synchronized (SingletonExample4.class){//同步锁
                if (instance == null){
                    instance = new SingletonExample4();  //A
                }
            }
        }
        return instance;
    }
}
